package com.lms.collection.queue;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;

/**
 * @Author: 李孟帅
 * @CreateTime: 2020-06-19 06:44
 * @Description:
 */
public class ArrayBlockingQueueDemo {
    public static void main(String[] args) throws InterruptedException {
        //创建具有给定（固定）容量和默认访问策略的 ArrayBlockingQueue 。
        ArrayBlockingQueue<Object> blockingQueue = new ArrayBlockingQueue<>(4);
        //创建一个 ArrayBlockingQueue具有给定（固定）容量和指定访问策略。
        ArrayBlockingQueue<Object> objects = new ArrayBlockingQueue<>(4, false);
        //创建一个 ArrayBlockingQueue具有给定（固定）容量，指定访问策略和最初包含给定集合中的元素，添加在收集迭代器的遍历顺序。
        ArrayBlockingQueue<Integer> integers = new ArrayBlockingQueue<>(4, false, Arrays.asList(1, 2, 4));
        //在插入此队列的尾部，如果有可能立即这样做不超过该队列的容量，返回指定的元素 true成功时与抛出 IllegalStateException如果此队列已满。
        boolean add = blockingQueue.add(1);
        boolean add2 = blockingQueue.add(3);
        //最多从该队列中删除给定数量的可用元素，并将它们添加到给定的集合中。
        int i = blockingQueue.drainTo(new ArrayList<>(), 2);
        blockingQueue.add(1);
        blockingQueue.add(2);
        blockingQueue.add(3);
        blockingQueue.add(4);
        Iterator<Object> iterator = blockingQueue.iterator();
        //如果可以在不超过队列容量的情况下立即将其指定的元素插入该队列的尾部，则在成功时 false如果该队列已满，则返回 true 。
        boolean offer = blockingQueue.offer(5);
        //在该队列的尾部插入指定的元素，等待指定的等待时间，以使空间在队列已满时变为可用。
        boolean offer1 = blockingQueue.offer(5, 1, TimeUnit.MILLISECONDS);
        //检索并删除此队列的头，等待指定的等待时间（如有必要）使元素变为可用。
        Object poll = blockingQueue.poll(1, TimeUnit.SECONDS);
        //返回此队列可以理想地（在没有内存或资源限制）的情况下接受而不阻止的附加元素数。
        int i1 = blockingQueue.remainingCapacity();
        System.out.println(blockingQueue.size());
        //检索并删除此队列的头，如有必要，等待元素可用。
        Object take = blockingQueue.take();
        blockingQueue.take();
        blockingQueue.take();
        blockingQueue.take();
        System.out.println(take);


    }
}
